home *** CD-ROM | disk | FTP | other *** search
/ Amiga CD-Sensation: Golden Games / Amiga CD-Sensation - Ausgabe 2 - Golden Games (1996)(GTI - Schatztruhe)(DE)[!].iso / Brain Activity / Brain / BRAIN.ASM < prev    next >
Assembly Source File  |  1992-08-13  |  18KB  |  936 lines

  1.         opt    c-,d-,l-,x-
  2.  
  3. *
  4. *   Brain Version 1.01
  5. *
  6. *   © André Wichmann of CLUSTER in 1990
  7. *
  8. *   Started on  25/05/1990
  9. *   Last update 30/09/1990
  10. *
  11.  
  12.         incdir    RAM:include/
  13.         include    exec/exec_lib.i
  14.         include    exec/exec.i
  15.         include    exec/memory.i
  16.         include    intuition/intuition_lib.i
  17.         include    intuition/intuition.i
  18.         include    graphics/graphics_lib.i
  19.         include    libraries/dos_lib.i
  20.         include    libraries/dosextens.i
  21.  
  22. ALLOC        MACRO
  23.         move.l    #\1,d0
  24.         move.l    #\2,d1
  25.         CALLEXEC AllocMem
  26.         ENDM
  27. FREE        MACRO
  28.         move.l    \1,a1
  29.         move.l    #\2,d0
  30.         CALLEXEC FreeMem
  31.         ENDM
  32. MENU        MACRO
  33.         dc.l    \1
  34.         dc.w    \2,\3,\4,\5
  35.         dc.w    MENUENABLED
  36.         dc.l    Titel_\@
  37.         dc.l    \6
  38.         dc.w    0,0,0,0
  39. Titel_\@    dc.b    \7,0
  40.         EVEN
  41.         ENDM
  42.  
  43. ITEM        MACRO
  44.         dc.l    \1
  45.         dc.w    \2,\3,\4,\5
  46.         dc.w    ITEMENABLED!ITEMTEXT!HIGHCOMP!\6
  47.         dc.l    0
  48.         dc.l    Name_\@
  49.         dc.l    0
  50.         dc.b    \7,0
  51.         dc.l    0
  52.         dc.w    0
  53. Name_\@        dc.b    0,2
  54.         dc.b    RP_JAM1,0
  55.         dc.w    2,2
  56.         dc.l    0
  57.         dc.l    String_\@
  58.         dc.l    0
  59. String_\@    dc.b    \8,0
  60.         EVEN
  61.         ENDM
  62. EXCLUDE        MACRO
  63.         dc.l    \1
  64.         dc.w    \2,\3,\4,\5
  65.         dc.w    ITEMENABLED!ITEMTEXT!HIGHCOMP!CHECKIT!\6
  66.         dc.l    \7
  67.         dc.l    Name_\@
  68.         dc.l    0
  69.         dc.b    0,0
  70.         dc.l    0
  71.         dc.w    0
  72. Name_\@        dc.b    0,2
  73.         dc.b    RP_JAM1,0
  74.         dc.w    2,2
  75.         dc.l    0
  76.         dc.l    String_\@
  77.         dc.l    0
  78. String_\@    dc.b    \8,0
  79.         EVEN
  80.         ENDM
  81.  
  82. BOOLGAD        MACRO
  83.         dc.l    \1
  84.         dc.w    \2,\3,\4,\5
  85.         dc.w    GADGHNONE
  86.         dc.w    RELVERIFY
  87.         dc.w    BOOLGADGET
  88.         dc.l    0,0,0,0,0
  89.         dc.w    \6
  90.         dc.l    0
  91.         ENDM
  92. PRINT        MACRO
  93.         move.l    \1,d0
  94.         move.l    \2,d1
  95.         move.l    rp(pc),a1
  96.         CALLGRAF Move
  97.         lea    Text_\@(pc),a0
  98.         bsr    Print_text
  99.         bra.s    Branch_\@
  100. Text_\@        dc.b    \3,0
  101.         EVEN
  102. Branch_\@
  103.         ENDM
  104. LINE        MACRO
  105.         move.l    rp(pc),a1
  106.         move.l    \5,d0
  107.         CALLGRAF SetAPen
  108.         move.l    rp(pc),a1
  109.         move.l    \1,d0
  110.         move.l    \2,d1
  111.         CALLGRAF Move
  112.         move.l    \3,d0
  113.         move.l    \4,d1
  114.         CALLGRAF Draw
  115.         ENDM
  116. BOX        MACRO
  117.         move.l    rp(pc),a1
  118.         move.l    \5,d0
  119.         CALLGRAF SetAPen
  120.         move.l    rp(pc),a1
  121.         move.l    \1,d0
  122.         move.l    \2,d1
  123.         move.l    \3,d2
  124.         move.l    \4,d3
  125.         CALLGRAF RectFill
  126.         LINE    \1,\2,\3,\2,#5
  127.         LINE    \1,\2,\1,\4,#5
  128.         LINE    \3,\2,\3,\4,#6
  129.         LINE    \1,\4,\3,\4,#6
  130.         move.l    rp(pc),a1
  131.         move.l    #7,d0
  132.         CALLGRAF SetAPen
  133.         move.l    rp(pc),a1
  134.         move.l    \5,d0
  135.         CALLGRAF SetBPen
  136.         ENDM
  137.  
  138. MESSAGE        MACRO
  139.         move.l    rp(pc),a1
  140.         move.l    #0,d0
  141.         CALLGRAF SetAPen
  142.         move.l    rp(pc),a1
  143.         move.l    #0,d0
  144.         CALLGRAF SetBPen
  145.         move.l    rp(pc),a1
  146.         move.l    \1,d0
  147.         move.l    \2,d1
  148.         CALLGRAF Move
  149.         lea    Spaces(pc),a0
  150.         bsr    Print_text
  151.         move.l    rp(pc),a1
  152.         move.l    \1+2,d0
  153.         move.l    \2+2,d1
  154.         CALLGRAF Move
  155.         lea    Spaces(pc),a0
  156.         bsr    Print_text
  157.         move.l    rp(pc),a1
  158.         move.l    #RP_JAM1,d0
  159.         CALLGRAF SetDrMd
  160.         move.l    rp(pc),a1
  161.         move.l    #0,d0
  162.         CALLGRAF SetBPen
  163.         move.l    rp(pc),a1
  164.         move.l    #6,d0
  165.         CALLGRAF SetAPen
  166.         move.l    rp(pc),a1
  167.         move.l    \1+2,d0
  168.         move.l    \2+2,d1
  169.         CALLGRAF Move
  170.         lea    String_\@(pc),a0
  171.         bsr    Print_text
  172.         move.l    rp(pc),a1
  173.         move.l    #5,d0
  174.         CALLGRAF SetAPen
  175.         move.l    rp(pc),a1
  176.         move.l    \1+1,d0
  177.         move.l    \2+1,d1
  178.         CALLGRAF Move
  179.         lea    String_\@(pc),a0
  180.         bsr    Print_text
  181.         move.l    rp(pc),a1
  182.         move.l    #4,d0
  183.         CALLGRAF SetAPen
  184.         move.l    rp(pc),a1
  185.         move.l    \1,d0
  186.         move.l    \2,d1
  187.         CALLGRAF Move
  188.         lea    String_\@(pc),a0
  189.         bsr    Print_text
  190.         move.l    rp(pc),a1
  191.         move.l    #RP_JAM2,d0
  192.         CALLGRAF SetDrMd
  193.         bra.s    Label_\@
  194. String_\@    dc.b    \3,0
  195.         EVEN
  196. Label_\@
  197.         ENDM
  198.  
  199.         SECTION    "Brain",CODE
  200.  
  201.         include    user/WBStartup.i
  202.  
  203. _Main        bsr    OpenLibs
  204.         move.l    #4*8*8,d0
  205.         move.l    #MEMF_PUBLIC!MEMF_CLEAR,d1
  206.         CALLEXEC AllocMem
  207.         move.l    d0,LevelA
  208.         move.l    #4*8*8,d0
  209.         move.l    #MEMF_PUBLIC!MEMF_CLEAR,d1
  210.         CALLEXEC AllocMem
  211.         move.l    d0,LevelB
  212.         move.l    #4*64*8*8,d0
  213.         move.l    #MEMF_PUBLIC!MEMF_CLEAR,d1
  214.         CALLEXEC AllocMem
  215.         move.l    d0,Undo
  216.         move.l    #64*gg_SIZEOF,d0
  217.         move.l    #MEMF_PUBLIC!MEMF_CLEAR,d1
  218.         CALLEXEC AllocMem
  219.         move.l    d0,GadgetX
  220.         move.l    d0,Gadget4
  221.  
  222. New_Size    bsr    CloseInt
  223.         bsr    OpenInt
  224.         tst.l    Screenptr
  225.         beq    Fail_1
  226.         BOX    #44,#184,#123,#199,#1
  227.         PRINT    #52,#194,<"NEW GAME">
  228.         BOX    #140,#184,#187,#199,#2
  229.         PRINT    #148,#194,<"QUIT">
  230.         BOX    #204,#184,#275,#199,#3
  231.         PRINT    #212,#194,<"ICONIFY">
  232.         BOX    #100,#166,#147,#181,#4
  233.         PRINT    #108,#176,<"UNDO">
  234.         BOX    #164,#166,#219,#181,#1
  235.         PRINT    #172,#176,<"RETRY">
  236.         bsr    DisplayAbout
  237.  
  238. Create_New    clr.l    Won
  239.         bsr    New_Level
  240.         bsr    Show_LevelA
  241.         bsr    Show_LevelB
  242.         move.l    #0,Move
  243.         MESSAGE    #8,#148,<"                                     ">
  244.  
  245. Main_Event    move.l    Windowptr(pc),a0
  246.         bsr    Get_Message
  247.         cmp.l    #MENUPICK,d6
  248.         beq    Do_Menu
  249.         clr.l    d0
  250.         move.w    gg_GadgetID(a4),d0
  251.         cmp.l    #128,d0
  252.         beq    Create_New
  253.         cmp.l    #129,d0
  254.         beq    _End
  255.         cmp.l    #130,d0
  256.         beq    Iconify
  257.         cmp.l    #131,d0
  258.         beq    Un_do
  259.         cmp.l    #132,d0
  260.         beq    Retry
  261.         move.l    LevelB(pc),a0
  262.         move.l    d0,d1
  263.         lsl.l    #2,d1
  264.         cmp.l    #0,(a0,d1)
  265.         bne    IllegalMove
  266.         movem.l    d0-d7/a0-a6,-(sp)
  267.         move.l    Undo(pc),a1
  268.         move.l    Move(pc),d0
  269.         mulu    #4*64,d0
  270.         add.l    d0,a1
  271.         move.l    LevelB(pc),a0
  272.         move.l    Looper(pc),d0
  273. Copy_Level    move.l    (a0)+,(a1)+
  274.         dbra    d0,Copy_Level
  275.         addq.l    #1,Move
  276.         movem.l    (sp)+,d0-d7/a0-a6
  277.         bsr    Set
  278.         bsr    Show_LevelB
  279.         MESSAGE    #8,#148,<"                                     ">
  280.         move.l    LevelA(pc),a0
  281.         move.l    LevelB(pc),a1
  282.         move.l    Looper(pc),d0
  283. Compare        cmp.l    (a0)+,(a1)+
  284.         bne    Main_Event
  285.         dbra    d0,Compare
  286.         MESSAGE    #8,#148,<"       --- LEVEL FINISHED ! ---      ">
  287.         move.l    #1,Won
  288.         bra    Main_Event
  289.  
  290. Un_do        tst.l    Move
  291.         bne    UndoOk
  292.         MESSAGE    #8,#148,<"         --- CAN'T UNDO !!! ---      ">
  293.         bra    Main_Event
  294. UndoOk        subq.l    #1,Move
  295.         move.l    Undo(pc),a0
  296.         move.l    Move(pc),d0
  297.         mulu    #4*64,d0
  298.         add.l    d0,a0
  299.         move.l    LevelB(pc),a1
  300.         move.l    Looper(pc),d0
  301. ReCopy_Level    move.l    (a0)+,(a1)+
  302.         dbra    d0,ReCopy_Level
  303.         bsr    Show_LevelB
  304.         bra    Main_Event
  305.  
  306. Iconify        bsr    CloseInt
  307.         lea    AvailWindow(pc),a0
  308.         CALLINT OpenWindow
  309.         move.l    d0,Windowptr
  310.         move.l    d0,a0
  311.         move.l    wd_RPort(a0),rp
  312.  
  313. IconEvent    bsr    Show_Mem
  314.         move.l    #25,d1
  315.         CALLDOS Delay
  316.         move.l    Windowptr(pc),a0
  317.         move.l    wd_UserPort(a0),a0
  318.         CALLEXEC GetMsg
  319.         tst.l    d0
  320.         beq.s    IconEvent
  321.         move.l    d0,a1
  322.         CALLEXEC ReplyMsg
  323.  
  324.         move.l    Windowptr(pc),a0
  325.         CALLINT CloseWindow
  326.         bsr    OpenInt
  327.         BOX    #44,#184,#123,#199,#1
  328.         PRINT    #52,#194,<"NEW GAME">
  329.         BOX    #140,#184,#187,#199,#2
  330.         PRINT    #148,#194,<"QUIT">
  331.         BOX    #204,#184,#275,#199,#3
  332.         PRINT    #212,#194,<"ICONIFY">
  333.         BOX    #100,#166,#147,#181,#4
  334.         PRINT    #108,#176,<"UNDO">
  335.         BOX    #164,#166,#219,#181,#1
  336.         PRINT    #172,#176,<"RETRY">
  337.         bsr    Show_LevelA
  338.         bsr    Show_LevelB
  339.         bra    Main_Event
  340.  
  341. Show_Mem    lea    Title+2(pc),a5
  342.         move.l    #MEMF_CHIP,d1
  343.         CALLEXEC AvailMem
  344.         lea    Title+2(pc),a5
  345.         bsr    ConvertDec
  346.         move.l    #MEMF_FAST,d1
  347.         CALLEXEC AvailMem
  348.         move.b    #" ",(a5)+
  349.         move.b    #"F",(a5)+
  350.         move.b    #":",(a5)+
  351.         bsr.s    ConvertDec
  352.         move.l    #MEMF_LARGEST,d1
  353.         CALLEXEC AvailMem
  354.         move.b    #" ",(a5)+
  355.         move.b    #"L",(a5)+
  356.         move.b    #":",(a5)+
  357.         bsr.s    ConvertDec
  358.         move.l    #0,d1
  359.         CALLEXEC AvailMem
  360.         move.b    #" ",(a5)+
  361.         move.b    #"A",(a5)+
  362.         move.b    #":",(a5)+
  363.         bsr.s    ConvertDec
  364.         clr.b    (a5)+
  365.         move.l    rp(pc),a1
  366.         move.l    #30,d0
  367.         move.l    #7,d1
  368.         CALLGRAF Move
  369.         lea    Title(pc),a0
  370.         move.l    #31,d0
  371.         CALLGRAF Text
  372.         rts
  373.  
  374. ConvertDec    lsr.l    #8,d0
  375.         lsr.l    #2,d0
  376.         move.l    #10000,d1
  377.         moveq    #4,d2
  378.         clr.l    d3
  379. Convert        divu    d1,d0
  380.         divu    #10,d1
  381.         add.b    #"0",d0
  382.         cmp.b    #"0",d0
  383.         bne.s    Not_ZeroA
  384.         tst.l    d3
  385.         bne.s    Not_ZeroA
  386.         move.b    #" ",d0
  387.         bra.s    LetterOut
  388. Not_ZeroA    move.l    #1,d3
  389. LetterOut    move.b    d0,(a5)+
  390.         swap    d0
  391.         and.l    #$ffff,d0
  392.         dbra    d2,Convert
  393.         rts
  394.  
  395. AvailWindow    dc.w    588-(36*8-4),0,36*8-8,10
  396.         dc.b    -1,-1
  397.         dc.l    CLOSEWINDOW!MOUSEBUTTONS
  398.         dc.l    SMART_REFRESH!WINDOWDRAG!WINDOWCLOSE!RMBTRAP
  399.         dc.l    0
  400.         dc.l    0
  401.         dc.l    0
  402.         dc.l    0
  403.         dc.l    0
  404.         dc.w    0,0,0,0
  405.         dc.w    WBENCHSCREEN
  406. Windowptr_1    ds.l    1
  407.  
  408. Title        dc.b    "C:"
  409.         ds.b    38
  410. Buffer        ds.b    16
  411.  
  412. Do_Menu        cmp.l    #MENUNULL,d7
  413.         beq    Main_Event
  414.         move.l    d7,d0
  415.         and.l    #%11111,d0
  416.         lsl.l    #2,d0
  417.         lea    Titles(pc),a0
  418.         move.l    (a0,d0),a0
  419.         move.l    d7,d0
  420.         lsr.l    #5,d0
  421.         and.l    #%111111,d0
  422.         lsl.l    #2,d0
  423.         move.l    (a0,d0),a0
  424.         jmp    (a0)
  425.  
  426. Titles        dc.l    Items1,Items2,Items2
  427. Items1        dc.l    Calc_Size,Create_New,Retry,Un_do,Iconify,About,_End
  428. Items2        dc.l    Main_Event,Main_Event,Main_Event,Main_Event,Main_Event,Main_Event,Main_Event
  429. Items3        dc.l    Main_Event,Main_Event,Main_Event,Main_Event,Main_Event,Main_Event,Main_Event
  430.  
  431. About        clr.l    AboutFlag
  432.         bsr.s    DisplayAbout
  433.         bra    Main_Event
  434.  
  435. DisplayAbout    move.l    Screenptr(pc),ScreenptrA
  436.         move.l    rp(pc),hrp
  437.         tst.l    AboutFlag
  438.         bne    AboutFail
  439.         lea    AboutWindow(pc),a0
  440.         CALLINT OpenWindow
  441.         tst.l    d0
  442.         beq    AboutFail
  443.         move.l    d0,WindowptrA
  444.         move.l    d0,a0
  445.         move.l    wd_RPort(a0),rp
  446.         move.l    #1,AboutFlag
  447.  
  448.         BOX    #0,#0,#247,#179,#0
  449.         MESSAGE    #8+2,#8+4,<"     BRAIN Version 1.01">
  450.         MESSAGE    #12+2,#18+8,<"© André Wichmann of CLUSTER">
  451.         MESSAGE    #12+2,#28+8,<"  Posener Weg 4">
  452.         MESSAGE    #12+2,#38+8,<"  5300 Bonn 1">
  453.         MESSAGE    #12+2,#48+8,<"  West Germany">
  454.         MESSAGE    #8+2,#68+8,<"  This game is FREEWARE and">
  455.         MESSAGE #12+2,#78+8,<"may be copied as long as the">
  456.         MESSAGE    #8+2,#88+8,<"  doc-file is included, the">
  457.         MESSAGE    #8+2,#98+8,<" credits are not changed and">
  458.         MESSAGE    #12+2,#108+8,<" - NO - profit is made with">
  459.         MESSAGE    #12+2,#118+8,<"       distribution.">
  460.         MESSAGE    #8+2,#138+8,<"Dedicated to all programmers">
  461.         MESSAGE    #12+2,#148+8,<" who don't know what to do">
  462.         MESSAGE    #8+2,#158+8,<"while assembling/compiling!">
  463.         LINE    #247,#0,#247,#179,#6
  464.  
  465.         move.l    WindowptrA(pc),a0
  466.         bsr    Get_Message
  467.  
  468.         move.l    WindowptrA(pc),a0
  469.         CALLINT CloseWindow
  470. AboutFail    move.l    hrp(pc),rp
  471.         rts
  472.  
  473. AboutWindow    dc.w    36,10,248,180
  474.         dc.b    -1,-1
  475.         dc.l    MOUSEBUTTONS
  476.         dc.l    SMART_REFRESH!ACTIVATE!BORDERLESS!RMBTRAP
  477.         dc.l    0,0,0
  478. ScreenptrA    ds.l    1
  479.         dc.l    0
  480.         dc.w    0,0,0,0
  481.         dc.w    CUSTOMSCREEN
  482.  
  483. Calc_Size    lea    Item2_1(pc),a0
  484.         move.l    #2,d0
  485. Get_NewX    move.w    mi_Flags(a0),d1
  486.         and.l    #TOGGLESELECT,d1
  487.         tst.l    d1
  488.         bne.s    YeahX
  489.         move.l    (a0),a0
  490.         addq.l    #1,d0
  491.         bra.s    Get_NewX
  492. YeahX        move.w    d0,XSize
  493.         move.l    #2,d0
  494.         lea    Item3_1(pc),a0
  495. Get_NewY    move.w    mi_Flags(a0),d1
  496.         and.l    #TOGGLESELECT,d1
  497.         tst.l    d1
  498.         bne.s    YeahY
  499.         move.l    (a0),a0
  500.         addq.l    #1,d0
  501.         bra.s    Get_NewY
  502. YeahY        move.w    d0,YSize
  503.         clr.l    d0
  504.         clr.l    d1
  505.         move.w    XSize(pc),d0
  506.         move.w    YSize(pc),d1
  507.         move.l    d0,d2
  508.         move.l    d1,d3
  509.         mulu    d3,d2
  510.         move.w    d2,Mul
  511.         subq.l    #1,d2
  512.         move.l    d2,Looper
  513.         subq.l    #1,d0
  514.         subq.l    #1,d1
  515.         move.l    d0,XLooper
  516.         move.l    d1,YLooper
  517.         bra    New_Size
  518.  
  519. Retry        move.l    LevelB(pc),a0
  520.         move.l    Looper(pc),d0
  521. ClearB        move.l    #0,(a0)+
  522.         dbra    d0,ClearB
  523.         bsr    Show_LevelB
  524.         move.l    #0,Move
  525.         bra    Main_Event
  526.  
  527. IllegalMove    tst.l    Won
  528.         bne    Main_Event
  529.         MESSAGE #8,#148,<"        --- ILLEGAL MOVE ! ---       ">
  530.         bra    Main_Event
  531.  
  532. _End
  533. Fail_2        bsr    CloseInt
  534. Fail_1        bsr    CloseLibs
  535.         move.l    LevelA(pc),a1
  536.         move.l    #4*8*8,d0
  537.         CALLEXEC FreeMem
  538.         move.l    LevelB(pc),a1
  539.         move.l    #4*8*8,d0
  540.         CALLEXEC FreeMem
  541.         move.l    Undo(pc),a1
  542.         move.l    #4*64*8*8,d0
  543.         CALLEXEC FreeMem
  544.         move.l    GadgetX(pc),a1
  545.         move.l    #64*gg_SIZEOF,d0
  546.         CALLEXEC FreeMem
  547.         clr.l    d0
  548.         rts
  549.  
  550. OpenLibs    lea    Intuitionname,a1
  551.         clr.l    d0
  552.         CALLEXEC OpenLibrary
  553.         move.l    d0,_IntuitionBase
  554.         lea    Graphicsname,a1
  555.         clr.l    d0
  556.         CALLEXEC OpenLibrary
  557.         move.l    d0,_GfxBase
  558.         lea    Dosname,a1
  559.         clr.l    d0
  560.         CALLEXEC OpenLibrary
  561.         move.l    d0,_DosBase
  562.         rts
  563. CloseLibs    move.l    _IntuitionBase,a1
  564.         CALLEXEC CloseLibrary
  565.         move.l    _GfxBase,a1
  566.         CALLEXEC CloseLibrary
  567.         move.l    _DosBase,a1
  568.         CALLEXEC CloseLibrary
  569.         rts
  570.  
  571. Get_Message    move.l    a0,a5
  572. Clear_Port    move.l    wd_UserPort(a5),a0
  573.         CALLEXEC GetMsg
  574.         tst.l    d0
  575.         bne.s    Clear_Port
  576. Wait_Event    move.l    wd_UserPort(a5),a0
  577.         move.b    MP_SIGBIT(a0),d1
  578.         clr.l    d0
  579.         bset    d1,d0
  580.         CALLEXEC Wait
  581.         move.l    wd_UserPort(a5),a0
  582.         CALLEXEC GetMsg
  583.         tst.l    d0
  584.         beq.s    Wait_Event
  585.         move.l    d0,a1
  586.         move.l    im_Class(a1),d6
  587.         clr.l    d7
  588.         move.w    im_Code(a1),d7
  589.         move.l    im_IAddress(a1),a4
  590.         CALLEXEC ReplyMsg
  591.         rts
  592.  
  593. New_Level    move.l    LevelA(pc),a0
  594.         move.l    LevelB(pc),a1
  595.         move.l    Looper(pc),d0
  596. ClearLvs    move.l    #0,(a0)+
  597.         move.l    #0,(a1)+
  598.         dbra    d0,ClearLvs
  599.         lea    RandomTab(pc),a0
  600.         move.l    #0,d0
  601. SetRandom    move.l    d0,(a0)+
  602.         addq.l    #1,d0
  603.         cmp.w    Mul,d0
  604.         bne.s    SetRandom
  605.         move.l    Looper(pc),d7
  606.         lea    RandomTab(pc),a5
  607. SetLevelA    move.l    d7,-(sp)
  608. Get_RND        move.w    $dff006,d0
  609.         lsr.w    #8,d0
  610.         move.w    $dff006,d1
  611.         lsr.w    #1,d0
  612.         eor.b    d1,d0
  613.         move.w    $dff006,d1
  614.         lsr.w    #4,d0
  615.         eor.b    d1,d0
  616.         and.l    #15,d0
  617.         cmp.b    d7,d0
  618.         bgt.s    Get_RND
  619.         lsl.l    #2,d0
  620.         move.l    (a5,d0),d6
  621.         move.l    #-1,(a5,d0)
  622.         move.l    d6,d0
  623.         movem.l    d0-d7/a0-a6,-(sp)
  624.         move.l    LevelA(pc),a0
  625.         bsr.s    Set
  626.         cmp.w    #20,Mul
  627.         bgt.s    No_Show
  628.         bsr    Show_LevelA
  629. No_Show        movem.l    (sp)+,d0-d7/a0-a6
  630.         lea    RandomTab(pc),a0
  631.         lea    RandomTab(pc),a1
  632.         move.l    Looper(pc),d0
  633. ShortenTab    move.l    (a0)+,d1
  634.         tst.l    d1
  635.         bmi.s    No_Back
  636.         move.l    d1,(a1)+
  637. No_Back        dbra    d0,ShortenTab
  638.         move.l    (sp)+,d7
  639.         dbra    d7,SetLevelA
  640.         bsr    Show_LevelA
  641.         rts
  642.  
  643. Set        move.l    d0,d1
  644.         lsl.l    #2,d0
  645.         move.l    #1,(a0,d0)
  646.         divu    XSize,d1
  647.         move.l    d1,d0
  648.         and.l    #$f,d1
  649.         swap    d0
  650.         and.l    #$f,d0
  651.         move.l    d0,d2
  652.         move.l    d1,d3
  653.         addq.l    #1,d0
  654.         bsr.s    Plot
  655.         move.l    d2,d0
  656.         move.l    d3,d1
  657.         addq.l    #1,d1
  658.         bsr.s    Plot
  659.         move.l    d2,d0
  660.         move.l    d3,d1
  661.         subq.l    #1,d0
  662.         bsr.s    Plot
  663.         move.l    d2,d0
  664.         move.l    d3,d1
  665.         subq.l    #1,d1
  666.         bsr.s    Plot
  667.         rts
  668.  
  669. Plot        tst.l    d0
  670.         bmi.s    NoPlot
  671.         cmp.w    XSize,d0
  672.         bge.s    NoPlot
  673.         tst.l    d1
  674.         bmi.s    NoPlot
  675.         cmp.w    YSize,d1
  676.         bge.s    NoPlot
  677.         mulu    XSize,d1
  678.         add.l    d1,d0
  679.         lsl.l    #2,d0
  680.         cmp.l    #0,(a0,d0)
  681.         beq.s    NoPlot
  682.         add.l    #1,(a0,d0)
  683.         cmp.l    #4,(a0,d0)
  684.         ble.s    NoPlot
  685.         move.l    #1,(a0,d0)
  686. NoPlot        rts
  687.  
  688. Show_LevelA    move.l    LevelA(pc),a5
  689.         move.l    #0,d5
  690.         move.l    YLooper(pc),d7
  691. SLALoop_1    move.l    XBaseA(pc),d4
  692.         move.l    XLooper(pc),d6
  693. SLALoop_2    move.l    d4,d2
  694.         move.l    d5,d3
  695.         add.l    #15,d2
  696.         add.l    #15,d3
  697.         BOX    d4,d5,d2,d3,(a5)
  698.         move.l    rp(pc),a1
  699.         move.l    d4,d0
  700.         move.l    d5,d1
  701.         add.l    #4,d0
  702.         add.l    #10,d1
  703.         CALLGRAF Move
  704.         move.l    (a5)+,d0
  705.         add.b    #"0",d0
  706.         cmp.b    #"0",d0
  707.         bne.s    Not_Zero
  708.         move.b    #" ",d0
  709. Not_Zero    move.b    d0,Number
  710.         lea    Number(pc),a0
  711.         move.l    #1,d0
  712.         CALLGRAF Text
  713.         add.l    #16,d4
  714.         dbra    d6,SLALoop_2
  715.         add.l    #16,d5
  716.         dbra    d7,SLALoop_1
  717.         rts
  718.  
  719. Show_LevelB    move.l    LevelB(pc),a5
  720.         move.l    #0,d5
  721.         move.l    YLooper(pc),d7
  722. SLBLoop_1    move.l    XBaseB(pc),d4
  723.         move.l    XLooper(pc),d6
  724. SLBLoop_2    move.l    d4,d2
  725.         move.l    d5,d3
  726.         add.l    #15,d2
  727.         add.l    #15,d3
  728.         BOX    d4,d5,d2,d3,(a5)
  729.         move.l    rp(pc),a1
  730.         move.l    d4,d0
  731.         move.l    d5,d1
  732.         add.l    #4,d0
  733.         add.l    #10,d1
  734.         CALLGRAF Move
  735.         move.l    (a5)+,d0
  736.         add.b    #"0",d0
  737.         cmp.b    #"0",d0
  738.         bne.s    Not_Zero2
  739.         move.b    #" ",d0
  740. Not_Zero2    move.b    d0,Number
  741.         lea    Number(pc),a0
  742.         move.l    #1,d0
  743.         CALLGRAF Text
  744.         add.l    #16,d4
  745.         dbra    d6,SLBLoop_2
  746.         add.l    #16,d5
  747.         dbra    d7,SLBLoop_1
  748.         rts
  749.  
  750. OpenInt        clr.l    d0
  751.         move.w    XSize(pc),d0
  752.         mulu    #16,d0
  753.         mulu    #2,d0
  754.         add.l    #16,d0
  755.         move.l    #320,d1
  756.         sub.l    d0,d1
  757.         divu    #2,d1
  758.         and.l    #$ffff,d1
  759.         move.l    d1,XBaseA
  760.         add.l    #16,d1
  761.         clr.l    d0
  762.         move.w    XSize(pc),d0
  763.         mulu    #16,d0
  764.         add.l    d0,d1
  765.         move.l    d1,XBaseB
  766.         
  767.         move.l    GadgetX(pc),a5
  768.         move.l    #0,d5
  769.         move.l    YLooper(pc),d7
  770.         move.l    #0,d3
  771. Build_1        move.l    XBaseB(pc),d4
  772.         move.l    XLooper(pc),d6
  773. Build_2        move.l    a5,(a5)
  774.         add.l    #gg_SIZEOF,(a5)+
  775.         move.w    d4,(a5)+
  776.         move.w    d5,(a5)+
  777.         move.w    #16,(a5)+
  778.         move.w    #16,(a5)+
  779.         move.w    #GADGHCOMP,(a5)+
  780.         move.w    #RELVERIFY,(a5)+
  781.         move.w    #BOOLGADGET,(a5)+
  782.         move.l    #0,(a5)+
  783.         move.l    #0,(a5)+
  784.         move.l    #0,(a5)+
  785.         move.l    #0,(a5)+
  786.         move.l    #0,(a5)+
  787.         move.w    d3,(a5)+
  788.         move.l    #0,(a5)+
  789.         addq.w    #1,d3
  790.         add.w    #16,d4
  791.         dbra    d6,Build_2
  792.         add.w    #16,d5
  793.         dbra    d7,Build_1
  794.         sub.l    #gg_SIZEOF,a5
  795.         move.l    #0,(a5)
  796.  
  797.         clr.l    Screenptr
  798.         lea    Screen_1(pc),a0
  799.         CALLINT OpenScreen
  800.         tst.l    d0
  801.         beq.s    NoScreen
  802.         move.l    d0,Screenptr
  803.         move.l    d0,a0
  804.         add.l    #44,a0
  805.         lea    Colortable(pc),a1
  806.         move.l    #8,d0
  807.         CALLGRAF LoadRGB4
  808.         lea    Window_1(pc),a0
  809.         CALLINT OpenWindow
  810.         tst.l    d0
  811.         beq.s    NoWindow
  812.         move.l    d0,Windowptr
  813.         move.l    d0,a0
  814.         move.l    wd_RPort(a0),rp
  815.         move.l    Windowptr(pc),a0
  816.         lea    Menu1(pc),a1
  817.         CALLINT SetMenuStrip
  818.         rts
  819. NoWindow    move.l    Screenptr(pc),a0
  820.         CALLINT CloseScreen
  821.         clr.l    Screenptr
  822. NoScreen    rts
  823.  
  824. CloseInt    tst.l    Windowptr
  825.         beq.s    No_IntClose
  826.         move.l    Windowptr(pc),a0
  827.         CALLINT CloseWindow
  828.         move.l    Screenptr(pc),a0
  829.         CALLINT CloseScreen
  830.         clr.l    Screenptr
  831.         clr.l    Windowptr
  832. No_IntClose    rts
  833.  
  834. Print_text    clr.l    d0
  835.         move.l    a0,a2
  836. Count_Letters    cmp.b    #0,(a2)
  837.         beq.s    Found_Zero
  838.         addq.l    #1,d0
  839.         addq.l    #1,a2
  840.         bra.s    Count_Letters
  841. Found_Zero    CALLGRAF Text
  842.         rts
  843.  
  844. Screen_1    dc.w    0,0,320,200,3
  845.         dc.b    0,1
  846.         dc.w    0,CUSTOMSCREEN
  847.         dc.l    Topaz_80,0,0,0
  848.  
  849. Topaz_80    dc.l    T80_Name
  850.         dc.w    TOPAZ_EIGHTY
  851.         dc.b    FS_NORMAL
  852.         dc.b    FPF_ROMFONT
  853. T80_Name    dc.b    "topaz.font",0
  854.         EVEN
  855.  
  856. Window_1    dc.w    0,0,320,200
  857.         dc.b    -1,-1
  858.         dc.l    GADGETUP!GADGETDOWN!MENUPICK
  859.         dc.l    SMART_REFRESH!ACTIVATE!BORDERLESS
  860.         dc.l    Gadget0
  861.         dc.l    0,0
  862. Screenptr    ds.l    1
  863.         dc.l    0
  864.         dc.w    0,0,0,0
  865.         dc.w    CUSTOMSCREEN
  866. Gadget0        BOOLGAD    Gadget1,44,184,80,16,128
  867. Gadget1        BOOLGAD    Gadget2,140,184,48,16,129
  868. Gadget2        BOOLGAD Gadget3,204,184,72,16,130
  869. Gadget3        BOOLGAD Gadget4,100,166,48,16,131
  870. Gadget4        BOOLGAD GadgetX,164,166,56,16,132
  871.  
  872. Menu1        MENU    Menu2,16,0,80,12,Item1_1,<"Project   ">
  873. Item1_1        ITEM    Item1_2,0,0,80,12,0,0,<"New Size  ">
  874. Item1_2        ITEM    Item1_3,0,12,80,12,0,0,<"New Game  ">
  875. Item1_3        ITEM    Item1_4,0,24,80,12,0,0,<"New Try   ">
  876. Item1_4        ITEM    Item1_5,0,36,80,12,0,0,<"Undo      ">
  877. Item1_5        ITEM    Item1_6,0,48,80,12,0,0,<"Iconify   ">
  878. Item1_6        ITEM    Item1_7,0,60,80,12,0,0,<"About...  ">
  879. Item1_7        ITEM    0,0,72,80,12,0,0,<"Quit      ">
  880. Menu2        MENU    Menu3,112,0,64,12,Item2_1,<"X-Size  ">
  881. Item2_1        EXCLUDE Item2_2,0,0,64,12,0,%1111110,<"   2    ">
  882. Item2_2        EXCLUDE Item2_3,0,12,64,12,TOGGLESELECT,%1111101,<"   3    ">
  883. Item2_3        EXCLUDE Item2_4,0,24,64,12,0,%1111011,<"   4    ">
  884. Item2_4        EXCLUDE Item2_5,0,36,64,12,0,%1110111,<"   5    ">
  885. Item2_5        EXCLUDE Item2_6,0,48,64,12,0,%1101111,<"   6    ">
  886. Item2_6        EXCLUDE Item2_7,0,60,64,12,0,%1011111,<"   7    ">
  887. Item2_7        EXCLUDE 0,0,72,64,12,0,%0111111,<"   8    ">
  888. Menu3        MENU    0,192,0,64,12,Item3_1,<"Y-Size  ">
  889. Item3_1        EXCLUDE Item3_2,0,0,64,12,0,%1111110,<"   2    ">
  890. Item3_2        EXCLUDE Item3_3,0,12,64,12,TOGGLESELECT,%1111101,<"   3    ">
  891. Item3_3        EXCLUDE Item3_4,0,24,64,12,0,%1111011,<"   4    ">
  892. Item3_4        EXCLUDE Item3_5,0,36,64,12,0,%1110111,<"   5    ">
  893. Item3_5        EXCLUDE Item3_6,0,48,64,12,0,%1101111,<"   6    ">
  894. Item3_6        EXCLUDE Item3_7,0,60,64,12,0,%1011111,<"   7    ">
  895. Item3_7        EXCLUDE 0,0,72,64,12,0,%0111111,<"   8    ">
  896.  
  897.         SECTION    "Brain",DATA
  898.  
  899. XSize        dc.w    3
  900. YSize        dc.w    3
  901. Looper        dc.l    3*3-1
  902. Mul        dc.w    3*3
  903. XLooper        dc.l    3-1
  904. YLooper        dc.l    3-1
  905. Colortable    dc.w    $000,$a00,$00a,$808,$066,$999,$333,$bbb
  906. Spaces        dc.b    "                                     ",0
  907.         EVEN
  908. Intuitionname    dc.b    "intuition.library",0
  909.         EVEN
  910. Graphicsname    dc.b    "graphics.library",0
  911.         EVEN
  912. Dosname        dc.b    "dos.library",0
  913.         EVEN
  914.  
  915.         SECTION    "Brain",BSS
  916.  
  917. Windowptr    ds.l    1
  918. rp        ds.l    1
  919. Won        ds.l    1
  920. XBaseB        ds.l    1
  921. XBaseA        ds.l    1
  922. Move        ds.l    1
  923. LevelA        ds.l    1
  924. LevelB        ds.l    1
  925. Undo        ds.l    1
  926. GadgetX        ds.l    1
  927. Number        ds.l    1
  928. RandomTab    ds.l    10*10
  929. _IntuitionBase    ds.l    1
  930. _GfxBase    ds.l    1
  931. _DosBase    ds.l    1
  932. hrp        ds.l    1
  933. AboutFlag    ds.l    1
  934. WindowptrA    ds.l    1
  935.  
  936.